<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of UsuarioBO
 *
 * @author thales
 */
class UsuarioBO {
    private $usuario;
    private $perfil;
    private $usuarioPerfil;
    private $conn;
    
    public function __construct() {
        $this->conn           = DB::getConn();
        $this->usuario        = new UsuarioVO();
        $this->perfil         = new PerfilVO;
        $this->usuarioPerfil  = new UsuarioPerfilVO;
    }
    
    /**
     * Método para retornar um objeto do tipo Usuario
     * 
     * @return objeto Usuario 
     */
    public function getUsuario(){
        return $this->usuario;
    }
    
     /**
     * Método para retornar um objeto do tipo Perfil
     * 
     * @return objeto Perfil 
     */
    public function getPerfil(){
        return $this->perfil;
    }
    
    /**
     * Método para retornar um objeto do tipo UsuarioPerfil
     * 
     * @return objeto UsuarioPerfil 
     */
    public function getUsuarioPerfil() {
        return $this->usuarioPerfil;
    }
    
    /**
     * Método para pesquisaar o usuário pelo nome.
     * 
     * @param string $nome
     * @return type 
     */
    public static function pegarDadosPeloNome($nome){

        if (strlen($nome) < 3 ) {
            throw new UserException('Digite um nome, com mais de 03 (três) caracteres, para a pesquisa!');
        }
        
        $objUsuarioBO = new UsuarioBO();
        
        $nome = $nome . '%';
        $email = $nome . '%';
        
        $objUsuarioBO->getUsuario()->setNome($nome);
        $objUsuarioBO->getUsuario()->setEmail($nome, false);

        $objUsuarioDAO = new UsuarioDAO();
        
        $resultado = $objUsuarioDAO->pesquisarDados($objUsuarioBO);
        
        if ( empty ($resultado) ) {
            throw new UserException('Nenhum resultado encontrado!');
        }
     
        return $resultado;
    }
    
    public static function pegarDados($idUsuario){
        
        if ( !is_numeric($idUsuario) && $idUsuario < 1 ) {
            throw new UserException('Usuário inválido!');
        }
        
        $objUsuarioBO = new UsuarioBO();
        $objUsuarioBO->getUsuario()->setId($idUsuario);
        
        $objUsuarioDAO = new UsuarioDAO();
        if ( !$objUsuarioDAO->pesquisar($objUsuarioBO) ){
            throw new UserException('Não foi possível pegar os dados do usuário!');
        }
        
        return $objUsuarioBO;
    }
    
     /**
     * Método responsável por adcionar um novo usuário.
     * 
     * @param string $nome
     * @param string $email
     * @param string $senha
     * @param integer $perfilId
     * @return boolean 
     */
    public function salvarUsuario($nome,$email,$senha,$perfilId){
        
        $this->getUsuario()->setNome($nome);
        $this->getUsuario()->setEmail($email);
        $this->getUsuario()->setSenha(LoginBO::crip($senha));
        $this->getUsuarioPerfil()->setPerfilId($perfilId);
        
        $objUsuarioDAO = new UsuarioDAO();
        $objUsuarioPerfilDAO = new UsuarioPerfilDAO();
        
        $this->conn->beginTransaction();
        
        $idUsuario = 0;
        
        if(!$idUsuario = $objUsuarioDAO->salvar($this->getUsuario())){
            $this->conn->rollBack();
            throw new UserException('Não foi possível salvar os dados!');
        }
        
        $this->getUsuarioPerfil()->setUsuarioId($idUsuario);
        
        if(!$objUsuarioPerfilDAO->salvar($this->getUsuarioPerfil())){
           $this->conn->rollBack(); 
        }
        
        $this->conn->commit();
        
        return true;
    }
    
    public function atualizarUsuario($id,$nome,$email,$senha,$perfilId) {

        $this->getUsuario()->setId($id);
        $this->getUsuario()->setNome($nome);
        $this->getUsuario()->setEmail($email);
        $this->getUsuario()->setSenha($senha != '' ? LoginBO::crip($senha) : '');
        $this->getUsuarioPerfil()->setUsuarioId($id);
        $this->getUsuarioPerfil()->setPerfilId($perfilId);
        
        $objUsuarioDAO = new UsuarioDAO();
        $objUsuarioPerfilDAO = new UsuarioPerfilDAO;
        
            
        
        $this->conn->beginTransaction();
        
        if ( !$objUsuarioDAO->alterar($this->getUsuario()) ){
            $this->conn->rollBack();
            throw new UserException('Não foi possível salvar os dados do usuário!');
        }
        
        if ( !$objUsuarioPerfilDAO->alterar($this->getUsuarioPerfil()) ) {
            $this->conn->rollBack();
            throw new UserException('Não foi possível salvar os dados do usuário e o seu perfil!');
        }
        
        $this->conn->commit();

    }
    
    /**
     * Método que recebe o id do usuário e exclui o seu cadastro
     * 
     * @param integer $id 
     */
    public function excluirUsuario($id){
        
       $objUsuarioVO = $this->getUsuario();
       $objUsuarioVO->setId($id);
       
       $objUsuarioPerfilVO = $this->getUsuarioPerfil();
       $objUsuarioPerfilVO->setUsuarioId($id);
        
       $objUsuarioDAO = new UsuarioDAO();
       $objUsuarioPerfilDAO = new UsuarioPerfilDAO();
       
       //inicia transação
       $this->conn->beginTransaction();
       
       if ( !$objUsuarioPerfilDAO->excluir($objUsuarioPerfilVO) ){
           $this->conn->rollBack();
           throw new UserException('Não foi possível excluir o perfil usuário!');
       }
       
       if ( !$objUsuarioDAO->excluir($objUsuarioVO) ){
           $this->conn->rollBack();
           throw new UserException('Não foi possível excluir o usuário!');
       }
       
       $this->conn->commit();
    }
}

?>
